#ifndef IMAGE_H
#define IMAGE_H

#include <QObject>
#include<QLabel>
struct RGB
{
   int r;
   int g;
   int b;
};

class Image : public QObject
{
    Q_OBJECT
public:
    double &At(int row, int col) const; //获取第row行第col列的矩阵元素的值
    explicit Image(QObject *parent = nullptr);
    Image(); //无参数的构造函数，创建行列都为零的Image对象
    Image(int h, int w); //构造函数重载，创建h行，w列的Image对象
    Image(const char *ImageName); //构造函数重载，利用文件名从硬盘加载图像文件成为Image对象;
//    Image(const QImage& qimg);//由QImage类构造
//    Image (const QLabel& lab);
    Image(const Image &im); //拷贝构造函数;
    virtual ~Image(); //析构函数;
    void ReadBMP(const char *filename); //从BMP文件中读入图像数据;
    void WriteBMP(const char *filename); //将图像数据保存为BMP图像文件;
    void WriteText(const char *filename);
    static double *NewData(int h, int w, double value = 0);
    void Resize(int h, int w); //图像的缩放为参数指定的大小
    void Rotate(int degree);//图像旋转的函数（简单起见，旋转角度为90度的整数倍）
    void  DrawLine(int x1,int y1,int x2,int y2,int r ,RGB* rgb );
    void  DrawCircle(int x,int y,int r,RGB* rgb );
    void ShowImage(QLabel* wid);
    void gray();
    void sobel();
    void Flip(int code); //图像的翻转; 根据code的值：0:左右翻转，1:上下翻转;
    const uchar* GetData();//获取uchar格式的图片数据
    void BrightContrast(int bri,int con,const Image* ori_img);
    void Normalize();
    void Cut(int x1, int y1, int x2, int y2);//裁剪点(x1,y1)到点(x2,y2)的图像
    Image operator-();
    int Height() const;
    int Width() const;
    operator QImage ();//类型转换函数，实现了将Image类转换为QImage类
private:
    int height;
    int width;
    double *data;

signals:

};
//Image* get_image(QLabel* lab){
//    QImage qimg = lab->pixmap().toImage();
//    Image *img=new Image(qimg);
//    return img;
//}

#endif // IMAGE_H
